package com.yky.utils;


import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

/**
 * 图片上传工具�?
 * 
 * @author vimesly
 * 
 */
public final class ImageFile {

	private ImageFile() {
		// System.out.println("实例化|ImageFile");
	}

	/**
	 * 允许的图片后缀类型
	 */
	private static final String[] RIGHT_TYPE = { ".JPG", ".jpg"};

	/**
	 * 图片格式是否超过指定容量
	 * 
	 * @param byteSize
	 *            图片的字节大�?
	 * @param gtKB
	 *            指定的大�?,单位KB
	 * @return true为大于指定容�?
	 */
	public static boolean isSizeGtKB(final int byteSize, final int gtKB) {
		return byteSize > gtKB * 1024;
	}

	/**
	 * 图片格式是否超过指定容量
	 * 
	 * @param byteSize
	 *            图片的字节大�?
	 * @param gtMB
	 *            指定的大�?,单位MB
	 * @return true为大于指定容�?
	 */
	public static boolean isSizeGtMB(final int byteSize, final int gtMB) {
		return byteSize > gtMB * 1024 * 1024;
	}

	/**
	 * 生成图片名称
	 * 
	 * @param imageName
	 *            原图片名�?,带后�?�?
	 * @param imageSize
	 *            原图片字节大�?
	 * @return 生成后的图片名称
	 */
	public static String buildImageName(String imageName, final int imageSize) {
		// 获取图片不带后缀的名�?
		String partLeftName = imageName
				.substring(0, imageName.lastIndexOf("."));
		// 获取图片后缀�?
		String partRightType = imageName.substring(imageName.lastIndexOf("."));

		// partLeftName = HexCode.encode(partLeftName);
		imageName = partLeftName + partRightType;
		// sm代表小容量的,1970�?1�?1日午夜开始经过的毫秒数加上图片字节大�?,原图�?(�?16进制)名称
		imageName = "sm_" + (System.currentTimeMillis() + imageSize) + "_"
				+ imageName;
		return imageName;
	}

	/**
	 * 将图片流写入服务�?
	 * 
	 * @param input
	 *            图片�?
	 * @param file
	 *            要写入的文件对象
	 * @throws Exception
	 */
	public static void write(final InputStream input, final File file)
			throws Exception {
		OutputStream partOutput = new FileOutputStream(file);
		byte[] partBuffer = new byte[input.available()];

		if (input.read(partBuffer) != -1) {
			partOutput.write(partBuffer);
		}
		partOutput.flush();
		partOutput.close();
		input.close();
	}

	/**
	 * 验证图片的格式
	 * 
	 * @param type
	 *            图片后缀类型
	 * @return true为有效的格式
	 */
	public static boolean checkImageType(String type) {
		if (type == null) {
			return false;
		}
		type = type.toLowerCase();
		for (int i = 0; i < RIGHT_TYPE.length; i++) {
			if (type.equals(RIGHT_TYPE[i])) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 获取图片的类型
	 * 
	 * @param input
	 *            图片�?
	 * @return 图片的后�?类型
	 * @throws Exception
	 */
	public static String getImageType(final Object input) throws Exception {
		ImageInputStream partIIS = ImageIO.createImageInputStream(input);
		Iterator partIt = ImageIO.getImageReaders(partIIS);
		ImageReader partReader = null;

		if (!partIt.hasNext()) {
			return null;
		}
		partReader = (ImageReader) partIt.next();
		partIIS.close();
		return partReader.getFormatName();
	}

	public static void main(String[] args) {
		// System.out.println(buildImageName("哈哈.jpg",20987));
		// System.out.println(isSizeGtMB(1024*1024,1));
		// System.out.println(isSizeGtMB(1024*1024+1,1));
		// System.out.println(isSizeGtKB(1024,1));
		// System.out.println(isSizeGtKB(1025,1));
		// System.out.println(checkImageType("aaa.gif"));
	}
}
